/*
 * Copyright (c) 2010-2013 Ruben Chakhmakhchyan. All rights reserved.
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Eclipse Public License
 * Version 1.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://opensource.org/licenses/EPL-1.0 and read it before using this file.
 */

#pragma once

#include "resource.h"       // main symbols
#include "com_i.h"


#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif

using namespace ATL;

#include "plugin_model.h"
#include "plugin_impl.h"


// CScriptableImageIndexer

class ATL_NO_VTABLE CScriptableDeviceIndexer :
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CScriptableDeviceIndexer, &CLSID_ScriptableDeviceIndexer>,
	public IDispatchImpl<IScriptableDeviceIndexer, &IID_IScriptableDeviceIndexer, &LIBID_comLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
	typedef IDispatchImpl<IScriptableDeviceIndexer, &IID_IScriptableDeviceIndexer, &LIBID_comLib> BaseDispatch;

public:
	CScriptableDeviceIndexer();
	~CScriptableDeviceIndexer();


DECLARE_REGISTRY_RESOURCEID(IDR_SCRIPTABLEDEVICEINDEXER)


BEGIN_COM_MAP(CScriptableDeviceIndexer)
	COM_INTERFACE_ENTRY(IScriptableDeviceIndexer)
	COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()


	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return S_OK;
	}

	void FinalRelease()
	{
	}

	STDMETHOD(GetIDsOfNames)( _In_ REFIID riid, _In_count_(cNames) _Deref_pre_z_ LPOLESTR* rgszNames, _In_ UINT cNames, _In_ LCID lcid, _Out_ DISPID* rgdispid);

	STDMETHOD(Invoke)( _In_ DISPID dispidMember, _In_ REFIID riid, _In_ LCID lcid, _In_ WORD wFlags, _In_ DISPPARAMS* pdispparams, _Out_opt_ VARIANT* pvarResult, _Out_opt_ EXCEPINFO* pexcepinfo, _Out_opt_ UINT* puArgErr);

public:

	STDMETHOD(get_length)(VARIANT* pVal);
	STDMETHOD(get_count)(VARIANT* pVal);

public:

	void setScriptableControl( CScriptableControl* value ) { m_model = value->m_plugin->getModel(); }

private:

	PluginModel* m_model;
};


OBJECT_ENTRY_AUTO(__uuidof(ScriptableDeviceIndexer), CScriptableDeviceIndexer)
